﻿<?php

/**
 * Cms_AdmingroupController
 * 
 * @author MF
 * @version 2.0
 */

require_once 'Zend/Controller/Action.php';

class Cms_AdmingroupController extends Zend_Controller_Action {
	
	function init() {
		CmsAccess::restrictModule('administrators');
	}
	
	public function indexAction() {
		
	}
	
	public function dataAction() {
		
		$group = MF_Main::getInstance()->AdminGroup;
		
		if (NULL !== $filter = $this->getRequest()->getParam('filter')) {
			$filter = $this->_helper->jsonEncoding($filter);
			$group = $group->search();
			$group->name = $filter;
			$group->Make();
		}
		
		$aList = array();
		for ($g=0;$g<$group->length();$g++) {
			$curGroup = $group->item($g);
			
			$adminList = array();
			$get_admins = $curGroup->adminList();
			for ($a=0;$a<$get_admins->length();$a++) {
				array_push($adminList,"{$get_admins->item($a)->name} ({$get_admins->item($a)->login})");
			}
			
			array_push($aList,
				array(
					array("group_row_num",array('nn' => $g+1)),
					array("group_name",array('name' => $curGroup->name,'summary' => $curGroup->summary)),
					array("group_admins",array('id' => $curGroup->group_id, 'list' => $adminList)),
					array("group_modul",array('id' => $curGroup->group_id)),
					array("group_edit",array('id' => $curGroup->group_id)),
					array("group_delete",array('id' => $curGroup->group_id))
				));
		}
		
		$this->view->data = $aList; 
		$this->renderScript('json.phtml');
	}
	
	
	public function deleteAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		MF_Main::getInstance()->AdminGroup->getById($id)->delete();
		
		$this->view->data = array('s' => 1);
		$this->renderScript('json.phtml');
	}
	
	public function addAction() {
		$this->view->type = $this->getRequest()->getParam('type');
		
		$this->view->mode = 'add';
		
		if ($this->view->type=='save') {
			$post_data = $this->_helper->JsonEncoding($this->_request->getPost());
			
			$groupObj = MF_Main::getInstance()->AdminGroup;
			
			
			$resp = array();
			
			/** Следующий блок для дебага
			 * 
			 *  Необходимо проверить название, проверки должны быть следующие:
			 *  1. Название не может быть пустым
			 *  2. Название не может быть длинее 100 символов 
			 *  3. Проверка на уникальность
			**/
			$post_data['name'] = trim($post_data['name']);
			if (strlen($post_data['name'])==0) {
				$resp['name'] = '<strong>Не указано название группы.</strong> Поле с названием не может быть пустым.';
			} elseif (strlen($post_data['name'])>100) {
				$resp['name'] = '<strong>Название слишком длинное.</strong> Длина названия не может превышать 100 символов.';
			} else {
				$check_name = $groupObj->search();
				$check_name->name = $post_data['name'];
				$check_name->Make();
				if ($check_name->length()!==0) {
					$resp['name'] = '<strong>Название не уникально.</strong> Это название уже используется другой группой.' ; 
				}
			}
			
			if (count($resp)==0) {
				$newGroup = $groupObj->add();
				$newGroup->name = $post_data['name'];
				$newGroup->summary = $post_data['summary'];
				$resp['ok'] = '1';
			} else {
				$resp['ok'] = '0';
			}
			
			
			
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		} elseif ($this->view->type=='css') {
			$this->_response->clearHeaders();
			$this->_response->setHeader('Content-type','text/css');
		}
	}
	
	public function editAction() {
		
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->mode = 'edit';
		
		$groupObj = MF_Main::getInstance()->AdminGroup;
		
		$group = $groupObj->getById($id);
		$this->view->group_id = $group->group_id;
		$this->view->name = $group->name;
		$this->view->summary = $group->summary;
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		if ($this->view->type=='save') {
			$post_data = $this->_helper->jsonEncoding($this->_request->getPost());
			$resp = array();
			
			/** Следующий блок для дебага
			 * 
			 *  Необходимо проверить название, проверки должны быть следующие:
			 *  1. Название не может быть пустым
			 *  2. Название не может быть длинее 100 символов 
			 *  3. Проверка на уникальность
			**/
			
			$post_data['name'] = trim($post_data['name']);
			if (strlen($post_data['name'])==0) {
				$resp['name'] = '<strong>Не указано название группы.</strong> Поле с названием не может быть пустым.';
			} elseif (strlen($post_data['name'])>100) {
				$resp['name'] = '<strong>Название слишком длинное.</strong> Длина названия не может превышать 100 символов.';
			} elseif ($post_data['name']!=$group->name) {
				$check_name = $groupObj->search();
				$check_name->name = $post_data['name'];
				$check_name->Make();
				if ($check_name->length()!==0) {
					$resp['name'] = '<strong>Название не уникально.</strong> Это название уже используется другой группой.' ; 
				}
			}
			
			
			if (count($resp)==0) {
				$group->name = $post_data['name'];
				$group->summary = $post_data['summary'];
				$resp['ok'] = '1';
			} else {
				$resp['ok'] = '0';
			}
			
			
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		} else {
			
			if ($this->view->type=='css') {
				$this->_response->clearHeaders();
				$this->_response->setHeader('Content-type','text/css');
			}
			
			$this->render('add');
		}
	}
	
	public function adminsAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$main = MF_Main::getInstance();
		
		$groupObj = $main->AdminGroup;
		
		$group = $groupObj->getById($id);
		$this->view->group_id = $group->group_id;
		$this->view->name = $group->name;
		
		
		$adminsList = array();
		$get_admins = $main->Administrator;
		for ($a=0;$a<$get_admins->length();$a++) {
			array_push($adminsList,
				array(
					$get_admins->item($a)->administrator_id,
					"{$get_admins->item($a)->name} ({$get_admins->item($a)->login})",
					$group->checkAdmin($get_admins->item($a))
				));
		}
		
		$this->view->adminsList = $adminsList;
		
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			
			
			for ($a=0;$a<$get_admins->length();$a++) {
				$group->unlinAdmin($get_admins->item($a));
			}
			
			for ($p=0;$p<count($post_data['adminid']);$p++) {
				$group->linkAdmin($post_data['adminid'][$p]);
			}
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
		}
	}
	
	public function modulesAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$this->view->type = $this->getRequest()->getParam('type');
		
		$groupObj = MF_Main::getInstance()->AdminGroup;
		
		$group = $groupObj->getById($id);
		$this->view->group_id = $group->group_id;
		$this->view->name = $group->name;
		
		$modulesList = array();
		$modules = CmsModule::getInstance();
		for ($m=0;$m<$modules->length();$m++) {
			if ($modules->item($m)->use=='1') {
				array_push($modulesList,
					array(
						$modules->item($m)->key,
						$modules->item($m)->name,
						$group->checkModule($modules->item($m)->key)
					));
			}
		}
		$this->view->modulesList = $modulesList;
			
		if ($this->view->type=='save') {
			$post_data = $this->_request->getPost();
			
			
			for ($m=0;$m<$modules->length();$m++) {
				$group->unlinkModule($modules->item($m)->key);
			}
			
			for ($p=0;$p<count($post_data['module']);$p++) {
				$group->linkModule($post_data['module'][$p]);
			}
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		}
	}
	
	public function menuAction() {
		if (NULL === $id = $this->getRequest()->getParam('id')) {
			throw new Zend_Controller_Action_Exception('Required param "Id"', 404);
		}
		
		$main = MF_Main::getInstance();
		
		$menu = $main->Menu->getPointById($id);
		
		$this->view->menu_id = $menu->menu_id;
		$this->view->name = $menu->name;
		
		
		$get_groups = $main->AdminGroup;
		
		$groupsList = array();
		for ($g=0;$g<$get_groups->length();$g++) {
			array_push($groupsList,
				array(
					$get_groups->item($g)->group_id,
					$get_groups->item($g)->name,
					$get_groups->item($g)->checkMenu($menu)
				));
		}
		
		$this->view->groupsList = $groupsList;
		
		if ($this->getRequest()->getParam('type')=='save') {
			$post_data = $this->_request->getPost();
			
			$this->menuLinker($post_data['groupid'],$menu,$post_data['recursive']=='1' ? true : false);
			
			$resp['ok'] = '1';
			
			$this->view->data = $resp;
			$this->renderScript('json.phtml');
			
		}
		
	}	
	
	
	/**
	 * System function to attach priveleges to menu point
	 *
	 * @param array $checked_admins
	 * @param MenuItem $menu
	 * @param boolean $recursion
	 */
	private function menuLinker($checked_groups,$menu,$recursion) {
		
		$get_groups = MF_Main::getInstance()->AdminGroup;
		
		
		$get_groups->clearPrev($menu);
		for ($g=0; $g<count($checked_groups);$g++) {
			$get_groups->getById($checked_groups[$g])->linkMenu($menu);
		}
			
		if ($recursion) {
			for ($m=0;$m<$menu->length();$m++) {
				$this->menuLinker($checked_groups,$menu->item($m),$recursion);
			}
		}
		
	}
}